package com.ywk.base.toolClass.bigDecimal;

import java.math.BigDecimal;

/**
 * @Author zbh
 * @Date 2023/8/7
 */
public class BigDecimalTest {
    public static void main(String[] args) throws IllegalAccessException {
        //推荐使用字符串构造方法或valueOf()创建BigDecimal对象，
        BigDecimal b1 = new BigDecimal("2.35");
        BigDecimal b2 = BigDecimal.valueOf(-2.35);
        //BigDecimal b3 = new BigDecimal(2.35);//不允许使用此种方式（不能精确的得到相应的值，值会变大）

        //运算过程中（格式化小数点，加减乘除）会创建一个新的BigDecimal对象，原有的BigDecimal对象不变
        System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_UP));
        System.out.println(b1);
        //格式化小数点
        System.out.println("===============b1==================");
        System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_UP));//四舍五入，2.35变成2.4
        System.out.println(b1.setScale(1, BigDecimal.ROUND_DOWN));//直接删除多余的小数位，如2.35会变成2.3
        System.out.println(b1.setScale(1, BigDecimal.ROUND_UP));//进位处理，2.34变成2.4
        System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_DOWN));//五舍六入，2.35变成2.3

        System.out.println("===============b2==================");
        System.out.println(b2.setScale(1, BigDecimal.ROUND_HALF_UP));//四舍五入，2.35变成2.4
        System.out.println(b2.setScale(1, BigDecimal.ROUND_DOWN));//直接删除多余的小数位，如2.35会变成2.3
        System.out.println(b2.setScale(1, BigDecimal.ROUND_UP));//进位处理，2.34变成2.4
        System.out.println(b2.setScale(1, BigDecimal.ROUND_HALF_DOWN));//五舍六入，2.35变成2.3

        double value1=1.2345678912311;
        double value2=9.1234567890123;
        BigDecimal value3=new BigDecimal(Double.toString(value1));
        BigDecimal value4=new BigDecimal(Double.toString(value2));
        System.out.println("精确加法================="+add(value1, value2));
        System.out.println("精确减法================="+sub(value1, value2));
        System.out.println("精确乘法================="+mul(value1, value2));
        System.out.println("精确除法 使用默认精度 ================="+div(value1, value2));
        System.out.println("精确除法 设置精度================="+div(value1, value2,20));
        System.out.println("四舍五入 小数点后保留几位 ================="+round(value1, 10));
        System.out.println("比较大小 ================="+equalTo(value3, value4));

    }

    /**
     * 精确加法
     */
    public static double add(double value1, double value2) {
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 精确减法
     */
    public static double sub(double value1, double value2) {
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 精确乘法
     */
    public static double mul(double value1, double value2) {
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 精确除法 使用默认精度
     */
    public static double div(double value1, double value2) throws IllegalAccessException {
        return div(value1, value2, 10);
    }

    /**
     * 精确除法
     * @param scale 精度
     */
    public static double div(double value1, double value2, int scale) throws IllegalAccessException {
        if(scale < 0) {
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = BigDecimal.valueOf(value1);
        BigDecimal b2 = BigDecimal.valueOf(value2);
        // return b1.divide(b2, scale).doubleValue();
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 四舍五入
     * @param scale 小数点后保留几位
     */
    public static double round(double v, int scale) throws IllegalAccessException {
        return div(v, 1, scale);
    }

    /**
     * 比较大小
     */
    public static boolean equalTo(BigDecimal b1, BigDecimal b2) {
        if(b1 == null || b2 == null) {
            return false;
        }
        return 0 == b1.compareTo(b2);
    }
}
